package com.phoenix.util;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import jakarta.servlet.ServletOutputStream;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;

public class PDFUtil {
    /**
     * 利用模板生成pdf
     *
     * @param data         写入的数据
     * @param out          自定义保存pdf的文件流
     * @param templatePath pdf模板路径
     */
    public static void fillTemplate(Map<String, Object> data,
//                                    Map<String, String> photoMap,
                                    ServletOutputStream out, String templatePath) {
        PdfReader reader;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            // 读取pdf模板
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields acroFields = stamper.getAcroFields();
            BaseFont baseFont = BaseFont.createFont("src/main/resources/static/fonts/SarasaGothicSC-Regular.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            // 赋值
            for (String name : acroFields.getFields().keySet()) {
                String value = data.get(name) != null ? data.get(name).toString() : null;


                // 默认字号
                float fontSize = 10f;
                PdfString da = acroFields.getFieldItem(name).getMerged(0).getAsString(PdfName.DA);
                if (da != null) {
                    Object dab[] = AcroFields.splitDAelements(da.toUnicodeString());
                    if (dab[AcroFields.DA_SIZE] != null) fontSize = ((Float) dab[AcroFields.DA_SIZE]).floatValue();
                }

                // 文本框宽度
                Rectangle position = acroFields.getFieldPositions(name).get(0).position;
                float textBoxWidth = position.getWidth();
                // 文本框高度
                float textBoxHeight = position.getHeight();
                // 文本单行行高
                float ascent = baseFont.getFontDescriptor(baseFont.ASCENT, fontSize);
                // baseFont渲染后的文字宽度
                if (value != null) {
                    float textWidth = baseFont.getWidthPoint(value, fontSize);
                    // 文本框高度只够写一行，并且文字宽度大于文本框宽度，则缩小字体
                    if (textBoxHeight < ascent * 1.6) {
                        while (textWidth > textBoxWidth) {
                            fontSize--;
                            textWidth = baseFont.getWidthPoint(value, fontSize);
                        }
                    }
                }
                acroFields.setField(name, value);
            }

//            // 图片赋值
//            for (Map.Entry<String, String> entry : photoMap.entrySet()) {
//                if (Objects.isNull(entry.getKey())) {
//                    continue;
//                }
//                String key = entry.getKey();
//                String url = entry.getValue();
//                // 根据地址读取需要放入pdf中的图片
//                Image image = Image.getInstance(url);
//                // 设置图片在哪一页
//                PdfContentByte overContent = stamper.getOverContent(acroFields.getFieldPositions(key).get(0).page);
//                // 获取模板中图片域的大小
//                Rectangle signRect = acroFields.getFieldPositions(key).get(0).position;
//                float x = signRect.getLeft();
//                float y = signRect.getBottom();
//                // 图片等比缩放
//                image.scaleAbsolute(signRect.getWidth(), signRect.getHeight());
//                // 图片位置
//                image.setAbsolutePosition(x, y);
//                // 在该页加入图片
//                overContent.addImage(image);
//            }

            // 如果为false那么生成的PDF文件还能编辑，一定要设为true
            stamper.setFormFlattening(true);
            stamper.close();
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
            bos.close();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    }
}

